package org.example.com.controller;

import org.example.com.pojo.Result;
import org.example.com.pojo.User;
import org.example.com.service.UserService;
import org.example.com.utils.JwtUtil;
import org.example.com.utils.Md5Util;
import org.example.com.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/auth")
public class UserController {

	@Autowired
	UserService userService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

	// 登录
	@PostMapping("/login")
	public Result login(String phone, String password) {
		// 1. 手机号合法性检查
		if (phone == null || !phone.matches("^1\\d{10}$")) {
			return Result.error("手机号格式不正确，应为11位数字且以1开头");
		}

		// 2. 根据手机号查询用户
		User loginUser = userService.findByPhone(phone);

		// 3. 判断用户是否存在
		if (loginUser == null) {
			return Result.error("用户不存在");
		}

		// 4. 校验密码
		if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
			// 登录成功, 基于用户数据生成令牌
			Map<String, Object> claims = new HashMap<>();
			claims.put("id", loginUser.getId());
			claims.put("phone", loginUser.getPhone());
			claims.put("name", loginUser.getName());
			String token = JwtUtil.genToken(claims);

//			//解析token
//			Map<String, Object> claims1 = JwtUtil.parseToken(token);
//			System.out.println(claims1);

			return Result.success(token);
		}

		return Result.error("用户名或密码错误");
	}

	// 注册
	@PostMapping("/register")
	public Result register(
			String phone,
			String password,
            String name,
            String code) {

		// 1. 手机号合法性检查
		if (phone == null || !phone.matches("^1\\d{10}$")) {
			return Result.error("手机号格式不正确，应为11位数字且以1开头");
		}

        // 1.1 校验验证码
        String redisKey = "phone:" + phone;
        String cachedCode = stringRedisTemplate.opsForValue().get(redisKey);
        if ("" == cachedCode || !cachedCode.equals(code)) {
            return Result.error("验证码错误或已过期");
        }

		// 2. 检查手机号是否已存在
		User dbUser = userService.findByPhone(phone);
		if (dbUser != null) {
			return Result.error("该手机号已注册");
		}

		// 3. 加密密码
		String md5Password = Md5Util.getMD5String(password);

		// 4. 保存用户
		User user = new User();
		user.setPhone(phone);
		user.setPassword(md5Password);
		user.setName(name);
		userService.add(user);

        // 4.1 注册成功后清理验证码
        stringRedisTemplate.delete(redisKey);

		// 5. 生成 token
		Map<String, Object> claims = new HashMap<>();
		claims.put("id", user.getId());
		claims.put("phone", phone);
		claims.put("name", user.getName());
		String token = JwtUtil.genToken(claims);

		//存储用户信息到本地线程
		ThreadLocalUtil.set(user);


		return Result.success(token);
	}

    // 发送注册验证码（未登录可用）
    @PostMapping("/sendCode")
    public Result sendCode(String phone) {
        if (phone == null || !phone.matches("^1\\d{10}$")) {
            return Result.error("手机号格式不正确，应为11位数字且以1开头");
        }

        // 生成6位数字验证码
        int num = (int) ((Math.random() * 9 + 1) * 100000);
        String code = String.valueOf(num);

        // 写入Redis，5分钟过期
        String key = "phone:" + phone;
        stringRedisTemplate.opsForValue().set(key, code, 10, TimeUnit.MINUTES);

        // 模拟短信发送：直接返回
        return Result.success(code);
    }

	//查询用户信息
	@GetMapping("/user/info")
	public Result getUserInfo() {
		// 获取当前用户ID
		Map<String, Object> claims = ThreadLocalUtil.get();
		Integer userId = (Integer) claims.get("id");

		// 从数据库查询完整的用户信息
		User user = userService.findById(userId);

		// 构造返回的用户信息
		Map<String, Object> userInfo = new HashMap<>();
		userInfo.put("id", user.getId());
		userInfo.put("phone", user.getPhone());
		userInfo.put("name", user.getName());
		userInfo.put("avatar", user.getAvatar()); // 包含头像字段

		return Result.success(userInfo);
	}

	//修改密码
	@PostMapping("/user/changePassword")
	public Result changePassword(String oldPassword, String newPassword) {
		// 1. 获取当前用户信息
		Map<String, Object> claims = ThreadLocalUtil.get();
		Integer userId = (Integer) claims.get("id");
		
		// 2. 根据用户ID查询用户
		User currentUser = userService.findById(userId);
		if (currentUser == null) {
			return Result.error("用户不存在");
		}
		
		// 3. 验证旧密码
		if (!Md5Util.getMD5String(oldPassword).equals(currentUser.getPassword())) {
			return Result.error("原密码错误");
		}
		
		// 4. 验证新密码格式（可选）
		if (newPassword == null || newPassword.length() < 6) {
			return Result.error("新密码长度不能少于6位");
		}
		
		// 5. 更新密码
		String newMd5Password = Md5Util.getMD5String(newPassword);
		userService.updatePassword(userId, newMd5Password);
		
		return Result.success("密码修改成功");
	}

	//修改用户名
	@PostMapping("/user/changeName")
	public Result changeName(String newName) {
		// 1. 获取当前用户信息
		Map<String, Object> claims = ThreadLocalUtil.get();
		Integer userId = (Integer) claims.get("id");

		// 2. 验证新用户名
		if (newName == null || newName.trim().isEmpty()) {
			return Result.error("用户名不能为空");
		}

		if (newName.length() > 50) {
			return Result.error("用户名长度不能超过50个字符");
		}

		// 3. 检查用户名是否已被其他用户使用
		User existingUser = userService.findByName(newName.trim());
		if (existingUser != null && !existingUser.getId().equals(userId)) {
			return Result.error("该用户名已被使用");
		}

		// 4. 更新用户名
		userService.updateName(userId, newName.trim());

		// 5. 更新ThreadLocal中的用户信息
		claims.put("name", newName.trim());
		ThreadLocalUtil.set(claims);

		return Result.success("用户名修改成功");

	}
	//更新用户头像
	@PatchMapping("/updateAvatar")
	public Result updateAvatar(String avatarUrl) {
		userService.updateAvatar(avatarUrl);
		return Result.success();
	}
}